#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=1e9+7;
const int N=1500005;
int n,k;
int d[N],maxn=0;
struct node{
	int nex,to;
}e[N<<1];
int h[N],tot=0;
int dep[N],fa[N];
int L,R;
int st[N],vis[N];
inline ll ksm(ll a,ll b){
	ll res=1;
	while(b){
		if(b&1) res=res*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return res;
}
inline void add(int x,int y){
	e[++tot]={h[x],y};h[x]=tot;
}
inline void ad(int x,int y){
	add(x,y),add(y,x);
}
void dfs(int x,int f){
	dep[x]=dep[f]+1;
	for(int i=h[x];i;i=e[i].nex){
		int v=e[i].to;
		if(v==f) continue;
		dfs(v,x); 
	}
}
int dfss(int x,int f){
	dep[x]=dep[f]+1;int res=dep[x];
	for(int i=h[x];i;i=e[i].nex){
		int v=e[i].to;
		if(v==f||vis[v]) continue;
		res=max(res,dfss(v,x));
	}
	return res;
}
int main(){
	int x,y;
	freopen("life.in","r",stdin);
	freopen("life.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>k;
	for(int i=1;i<n;i++){
		cin>>x>>y;
		d[x]++,d[y]++;
		maxn=max(maxn,max(d[x],d[y]));
		ad(x,y);
	}
	if(k==1){
		cout<<"YES\n1";
		return 0;
	}
	if(k==2){
		cout<<"YES\n2";
		return 0;
	}
	if(maxn==2){
		cout<<"YES\n"<<k;
		return 0;
	}
	dfs(1,0);maxn=0;
	for(int i=1;i<=n;i++){
		if(dep[i]>maxn) maxn=dep[i],L=i;
	}
	dfs(L,0);maxn=0;
	for(int i=1;i<=n;i++){
		if(dep[i]>maxn) maxn=dep[i],R=i;
	}
	if(maxn<k){
		cout<<"YES\n"<<ksm(2,n);
		return 0;
	}
//	x=R;
//	for(int i=maxn;i>=1;i--){
//		st[i]=x;vis[x]=1;
//		x=fa[x];
//	}
//	for(int i=1;i<=maxn;i++){
//		dfss(i);
//	}
	return 0;
}

